
// 节流
let timer, flag;
export function throttle(func, wait = 500, immediate = true) {
  if (immediate) {
    if (!flag) {
      flag = true;
      // 如果是立即执行，则在wait毫秒内开始时执行
      typeof func === "function" && func();
      timer = setTimeout(() => {
        flag = false;
      }, wait);
    }
  } else {
    if (!flag) {
      flag = true;
      // 如果是非立即执行，则在wait毫秒内的结束处执行
      timer = setTimeout(() => {
        flag = false;
        typeof func === "function" && func();
      }, wait);
    }
  }
}

let timerId;

//防抖
export function debounce(func, delay) {
  return function () {
    clearTimeout(timerId);
    timerId = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

// file 转 base64
export function file2DataURL(file) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => {
      resolve(reader.result);
    };
  });
}
export function isNotEmpty(value) {
  return value !== null && value !== undefined && value !== "";
}

export function getImageDimensions(url) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => {
      resolve({ width: img.naturalWidth, height: img.naturalHeight });
    };
    img.onerror = (error) => {
      reject(error);
    };
    img.src = url;
  });
}
const SECOND = 1000
const MINUTE = 60 * SECOND
const HOUR = 60 * MINUTE
const DAY = 24 * HOUR
export function parseTimeData(time) {
  const days = Math.floor(time / DAY)
  const hours = Math.floor((time % DAY) / HOUR)
  const minutes = Math.floor((time % HOUR) / MINUTE)
  const seconds = Math.floor((time % MINUTE) / SECOND)
  const milliseconds = Math.floor(time % SECOND)
  return {
    days,
    hours,
    minutes,
    seconds,
    milliseconds,
  }
}

// 格式化时间戳
export function formatTimestamp(timestamp, format) {
  // 如果传入的是秒级时间戳，将其转换为毫秒级
  if (timestamp.toString().length === 10) {
    timestamp *= 1000;
  }

  const date = new Date(timestamp);

  // 格式化各部分
  const replacements = {
    yyyy: date.getFullYear(),
    MM: String(date.getMonth() + 1).padStart(2, '0'),  // 月份从0开始，+1
    dd: String(date.getDate()).padStart(2, '0'),
    HH: String(date.getHours()).padStart(2, '0'),
    mm: String(date.getMinutes()).padStart(2, '0'),
    ss: String(date.getSeconds()).padStart(2, '0'),
    SSS: String(date.getMilliseconds()).padStart(3, '0')
  };

  // 替换格式字符串中的各个部分
  return format.replace(/yyyy|MM|dd|HH|mm|ss|SSS/g, (match) => replacements[match] || match);
}


/**
 * 时间美化
 * 规则：1分钟之内显示：刚刚，1－30分钟显示：25分钟之前，超过30分钟但在今天显示具体时间：15:00,不在当天则显示日期：05/28，不在当天且不在当年则显示：2023/05/30。
 * @param {Number} time 聊天时间，单位：秒
 */
export function friendTime(time) {
  if (!isNumber(time)) {
    console.error(time, "不是时间戳");
    return "";
  }
  const timeMillsecond = time * 1000; //秒转成毫秒，统一单位，免得出错
  const currentDate = new Date();
  const currentTime = currentDate.getTime(); //当前时间
  const timeDifference = currentTime - timeMillsecond; //当前时间和发送时间的时间差
  console.log(timeDifference);
  if (timeDifference <= 60_000) {
    //显示刚刚
    return "刚刚";
  } else if (60_000 < timeDifference && timeDifference <= 30 * 60_000) {
    //显示 n分钟之前
    return Math.floor(timeDifference / 60_000) + "分钟之前";
  } else {
    //时间差大于30分钟的情况， 超过30分钟但在今天显示具体时间：比如 15:00，不在当天但在今年则显示日期：如 05/28，不在当天且不在当年则显示：如 2023/05/30
    const today = getDay(currentDate); //今天
    const chatDate = new Date(timeMillsecond); //聊天时的时间对象
    const chatDay = getDay(chatDate); //聊天时的时间对象对应的聊天日期格式字符串
    if (today === chatDay) {
      //在当天，显示具体时间
      return getHourMinute(chatDate);
    } else {
      //不在同一天
      const currentYear = currentDate.getFullYear(); //当前年份
      const chatYear = chatDate.getFullYear(); //聊天年份
      if (currentYear === chatYear) {
        //同一年
        return getMonthDay(chatDate);
      } else {
        return chatDay;
      }
    }
  }
}

/**
 * 获取当前时间对应的日期
 * @param {Date} date 需要计算的时间
 * @param {String} separator 分割符，默认 '/'
 */
export function getDay(date, separator = "/") {
  if (!isDate(date)) {
    //不是 Date 类型，直接退出
    console.error(date, "不是 Date 数据类型");
    return "";
  }
  const year = date.getFullYear(); //年
  const month = (date.getMonth() + 1).toString().padStart(2, "0"); //月
  const day = date.getDate().toString().padStart(2, "0"); //日
  return year + separator + month + separator + day;
}

/**
 * 获取时间对应的时分结构
 * @param {Date} date 当前时间
 * @param {String} separator 分割符，默认 ':'
 * @returns
 */
export function getHourMinute(date, separator = ":") {
  if (!isDate(date)) {
    //不是 Date 类型，直接退出
    console.error(date, "不是 Date 数据类型");
    return "";
  }
  const hour = date.getHours().toString().padStart(2, "0");
  const minute = date.getMinutes().toString().padStart(2, "0");
  return hour + separator + minute;
}

/**
 * 获取当前时间的月日格式化字符串
 * @param {Date} date 当前时间
 * @param {*} separator 分割符，默认 '/'
 * @returns
 */
export function getMonthDay(date, separator = "/") {
  if (!isDate(date)) {
    return "";
  }
  const month = (date.getMonth() + 1).toString().padStart(2, "0");
  const day = date.getDate().toString().padStart(2, "0");
  return month + separator + day;
}

/**
 * value 是否是 Number 类型对象
 * @param {any} value
 * @returns
 */
export function isNumber(value) {
  return (
    Number.isFinite(value) &&
    Object.prototype.toString.call(value) === "[object Number]"
  );
}

/**
 * value 是否是 Date 类型对象
 * @param {any} value
 * @returns
 */
export function isDate(value) {
  return (
    value instanceof Date &&
    Object.prototype.toString.call(value) === "[object Date]"
  );
}
export function hexToRgb(hex) {
  // 去除可能存在的 # 号
  hex = hex.replace("#", "");
  // 将 hex 分割成 R、G、B 三个部分
  const r = parseInt(hex.substring(0, 2), 16);
  const g = parseInt(hex.substring(2, 4), 16);
  const b = parseInt(hex.substring(4, 6), 16);
  // 根据需要添加 alpha（透明度）值

  const rgba = `${r},${g},${b}`;
  return rgba;
}
export function getImageUrl(name) {
  return new URL(`../assets/imgs/${name}`, import.meta.url).href
}